home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / Dev / Amiga-E / E_v3.2a / Src / Utils / GDU.e < prev    next >
Text File  |  1992-09-02  |  7KB  |  235 lines

  1. /* Graphical Recursive Disk Usage Program, remotely based on D.e
  2.  
  3.    displays whole harddiskpartitions and the like at once on screen,
  4.    and is able to zoom in/out, display info etc. [see requester]
  5.  
  6. */
  7.  
  8. OPT OSVERSION=37
  9.  
  10. MODULE 'class/stack', 'tools/clonescreen',
  11.        'dos/dosasl', 'dos/dos', 'utility', 'intuition/intuition'
  12.  
  13. CONST MAXPATH=250
  14.  
  15. ENUM ER_NONE,ER_BADARGS,ER_MEM,ER_UTIL,ER_COML
  16. ENUM ARG_DIR,NUMARGS
  17.  
  18. RAISE ER_MEM IF New()=NIL, ERROR_BREAK IF CtrlC()=TRUE, ER_MEM IF String()=NIL
  19.  
  20. OBJECT dir
  21.   name,size,sub,x,y,xs,ys
  22. ENDOBJECT
  23.  
  24. DEF dir,dirw[100]:STRING,rdargs=NIL,dirno=0,s[200]:STRING,b:PTR TO dir,
  25.     screen=NIL,font=NIL,win=NIL,xsize,ysize,depth,st:PTR TO stack
  26.  
  27. PROC consdir(name,size,sub) IS NEW [StrCopy(String(StrLen(name)),name),size,sub]:dir
  28.  
  29. PROC main() HANDLE
  30.   DEF args[NUMARGS]:LIST,templ,x,lock,fib:fileinfoblock,do=TRUE,code,qual,mx,my
  31.   IF EasyRequestArgs(win,[20,0,'Welcome to GraphicDiskUsage',
  32.       'cli usage = GDU <volume>\nleft mouse = display info\nright mouse = quit\nshift left mouse = zoom in\nshift right mouse = zoom out\nctrl c = quit [while scanning dir]\n',
  33.       'Go and Scan|Cancel'],0,NIL)=1
  34.     NEW st.stack()
  35.     IF (utilitybase:=OpenLibrary('utility.library',37))=NIL THEN Raise(ER_UTIL)
  36.     FOR x:=0 TO NUMARGS-1 DO args[x]:=0
  37.     templ:='DIR'
  38.     rdargs:=ReadArgs(templ,args,NIL)
  39.     IF rdargs=NIL THEN Raise(ER_BADARGS)
  40.     dir:=args[ARG_DIR]
  41.     IF dir THEN StrCopy(dirw,dir,ALL)
  42.     lock:=Lock(dirw,-2)
  43.     IF lock                  /* if yes, the prob. dir, else wildcard */
  44.       IF Examine(lock,fib) AND (fib.direntrytype>0)
  45.         AddPart(dirw,'#?',100)
  46.       ENDIF
  47.       UnLock(lock)
  48.     ENDIF
  49.     screen,font:=openclonescreen('Workbench','Graphic Disk Usage ($%#!)')
  50.     win:=backdropwindow(screen,$8,$10000)
  51.     depth,xsize,ysize:=getcloneinfo(screen)
  52.     WriteF('Scanning...\n')
  53.     b:=recdir(dirw)
  54.     SetTopaz(8)
  55.     refresh()
  56.     WHILE do
  57.       WaitIMessage(win)
  58.       code:=MsgCode()
  59.       qual:=MsgQualifier()
  60.       mx:=MouseX(win); my:=MouseY(win)
  61.       IF code=MENUDOWN
  62.         IF qual AND 1
  63.           zoomout()
  64.         ELSE
  65.           IF EasyRequestArgs(win,[20,0,'Quit?','Zure, man?','Yez|Noo'],0,NIL)=1 THEN do:=FALSE
  66.         ENDIF
  67.       ELSEIF code=SELECTDOWN
  68.         IF qual AND 1
  69.           zoomin(mx,my)
  70.         ELSE
  71.           findxy(b,mx,my)
  72.         ENDIF
  73.       ENDIF
  74.     ENDWHILE
  75.   ENDIF
  76. EXCEPT DO
  77.   closeclonescreen(screen,font,win)
  78.   IF rdargs THEN FreeArgs(rdargs)
  79.   IF utilitybase THEN CloseLibrary(utilitybase)
  80.   SELECT exception
  81.     CASE "SCR";                 WriteF('no screen!\n')
  82.     CASE "WIN";                 WriteF('no window!\n')
  83.     CASE ER_BADARGS;            WriteF('Bad Arguments for GDU!\n')
  84.     CASE ER_MEM;                WriteF('No mem!\n')
  85.     CASE ER_COML;               WriteF('No commandline specified\n')
  86.     CASE ER_UTIL;               WriteF('Could not open "utility.library" v37\n')
  87.     CASE ERROR_BREAK;           WriteF('User terminated GDU\n')
  88.     CASE ERROR_BUFFER_OVERFLOW; WriteF('Internal error\n')
  89.     DEFAULT;                    PrintFault(exception,'Dos Error')
  90.   ENDSELECT
  91. ENDPROC
  92.  
  93. PROC refresh()
  94.   SetRast(stdrast,0)
  95.   dogfx(b,5,20,xsize-10,ysize-30,TRUE)
  96. ENDPROC
  97.  
  98. PROC recdir(dirr) HANDLE
  99.   DEF er,i:PTR TO fileinfoblock,size=0,anchor=NIL:PTR TO anchorpath,
  100.       fullpath,x,num=0,l=NIL,rl:PTR TO dir
  101.   CtrlC()
  102.   anchor:=New(SIZEOF anchorpath+MAXPATH)
  103.   anchor.breakbits:=4096
  104.   anchor.strlen:=MAXPATH-1
  105.   er:=MatchFirst(dirr,anchor)            /* collect all strings */
  106.   WHILE er=0
  107.     fullpath:=anchor+SIZEOF anchorpath
  108.     i:=anchor.info
  109.     IF i.direntrytype<0
  110.       size:=size+Shr(i.size+1023,9)
  111.       num++
  112.     ELSE
  113.       x:=StrLen(fullpath)
  114.       IF x+5<MAXPATH THEN CopyMem('/#?',fullpath+x,4)
  115.       rl:=recdir(fullpath)
  116.       size:=size+rl.size
  117.       fullpath[x]:=0
  118.       ->l:=NEW [l,rl]
  119.       l:=addsorted(l,rl)
  120.     ENDIF
  121.     er:=MatchNext(anchor)
  122.   ENDWHILE
  123.   IF er<>ERROR_NO_MORE_ENTRIES THEN Raise(er)
  124.   MatchEnd(anchor)
  125.   Dispose(anchor)
  126.   anchor:=NIL
  127.   INC dirno
  128. EXCEPT
  129.   IF anchor THEN MatchEnd(anchor)
  130.   Raise(exception)
  131. ENDPROC consdir(dirr,IF size THEN size ELSE 1,l)
  132.  
  133. PROC addsorted(l:PTR TO LONG,d:PTR TO dir)
  134.   DEF d2:PTR TO dir,p:PTR TO LONG,c:PTR TO LONG
  135.   IF l=NIL
  136.     RETURN NEW [NIL,d]
  137.   ELSE
  138.     d2:=l[1]
  139.     IF d.size>d2.size
  140.       RETURN NEW [l,d]
  141.     ELSE
  142.       c:=l
  143.       REPEAT
  144.         p:=c; c:=c[]
  145.       UNTIL IF c THEN (d2:=c[1]) BUT d.size>d2.size ELSE TRUE
  146.       p[]:=NEW [c,d]
  147.     ENDIF
  148.   ENDIF
  149. ENDPROC l
  150.  
  151. PROC dogfx(b:PTR TO dir,x,y,xs,ys,isx)
  152.   DEF l:PTR TO LONG,cs=0,sb:PTR TO dir,mc,last
  153.   b.x:=x; b.y:=y; b.xs:=xs; b.ys:=ys
  154.   IF (xs>2) AND (ys>2)
  155.     Line(x,y,x+xs,y)
  156.     Line(x,y,x,y+ys)
  157.     Line(x+xs,y,x+xs,y+ys)
  158.     Line(x,y+ys,x+xs,y+ys)
  159.     l:=b.sub
  160.     WHILE l
  161.       l <=> [l,sb]
  162.       dogfx(sb,IF isx THEN Div(Mul(cs,xs),b.size)+x ELSE x,
  163.                IF isx THEN y ELSE Div(Mul(cs,ys),b.size)+y,
  164.                IF isx THEN Div(Mul(sb.size,xs),b.size) ELSE xs,
  165.                IF isx THEN ys ELSE Div(Mul(sb.size,ys),b.size),
  166.                Not(isx))
  167.       cs:=cs+sb.size
  168.     ENDWHILE
  169.     IF isx
  170.       x:=x+xs; xs:=xs-Div(Mul(cs,xs),b.size); x:=x-xs
  171.     ELSE
  172.       y:=y+ys; ys:=ys-Div(Mul(cs,ys),b.size); y:=y-ys
  173.     ENDIF
  174.     IF ys>10
  175.       IF xs>20
  176.         mc:=xs-4/8
  177.         last:=b.name+EstrLen(b.name)
  178.         WHILE (last>b.name) AND (last[]<>"/") AND (last[]<>":") DO last--
  179.         mc:=last-mc
  180.         IF mc<b.name THEN mc:=b.name
  181.         IF mc=last THEN StrCopy(s,'#?') ELSE StrCopy(s,mc,last-mc)
  182.         TextF(xs/2+x-(EstrLen(s)*4),ys/2+y+3,s)
  183.       ENDIF
  184.     ENDIF
  185.   ENDIF
  186. ENDPROC
  187.  
  188. PROC zoomin(x,y)
  189.   DEF l:PTR TO LONG,b2:PTR TO dir
  190.   l:=b.sub
  191.   WHILE l
  192.     b2:=l[1]
  193.     IF x>=b2.x
  194.       IF y>=b2.y
  195.         IF x<(b2.x+b2.xs)
  196.           IF y<(b2.y+b2.ys) THEN st.push(b) BUT (b:=b2) BUT refresh()
  197.         ENDIF
  198.       ENDIF
  199.     ENDIF
  200.     l:=l[]
  201.   ENDWHILE
  202. ENDPROC
  203.  
  204. PROC zoomout()
  205.   IF st.is_empty()
  206.     DisplayBeep(screen)
  207.   ELSE
  208.     b:=st.pop()
  209.     refresh()
  210.   ENDIF
  211. ENDPROC
  212.  
  213. PROC findxy(b:PTR TO dir,x,y)
  214.   DEF f=FALSE,l:PTR TO LONG,numsub=0
  215.   IF x>=b.x
  216.     IF y>=b.y
  217.       IF x<(b.x+b.xs)
  218.         IF y<(b.y+b.ys)
  219.           l:=b.sub
  220.           WHILE l
  221.             f:=f OR findxy(l[1],x,y)
  222.             l:=l[]
  223.             numsub++
  224.           ENDWHILE
  225.           IF f=FALSE
  226.             f:=TRUE
  227.             StringF(s,IF numsub THEN '\s, \d bytes [including \d subdir(s)].' ELSE '\s, \d bytes.',b.name,Shl(b.size,9),numsub)
  228.             SetWindowTitles(win,s,s)
  229.           ENDIF
  230.         ENDIF
  231.       ENDIF
  232.     ENDIF
  233.   ENDIF
  234. ENDPROC f
  235.